package edu.cibertec.sicsolutions.vfs.action;

import java.nio.charset.CodingErrorAction;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import edu.cibertec.sicsolutions.constants.Constants;
import edu.cibertec.sicsolutions.constants.SessionConstants;
import edu.cibertec.sicsolutions.util.DateUtil;
import edu.cibertec.sicsolutions.vfs.domain.votacion.Consolidado;
import edu.cibertec.sicsolutions.vfs.domain.votacion.Consulado;
import edu.cibertec.sicsolutions.vfs.domain.votacion.Escrutinio;
import edu.cibertec.sicsolutions.vfs.domain.votacion.Parametros;
import edu.cibertec.sicsolutions.vfs.domain.votacion.Usuario;
import edu.cibertec.sicsolutions.vfs.service.ConsolidadoService;
import edu.cibertec.sicsolutions.vfs.service.ConsuladoService;
import edu.cibertec.sicsolutions.vfs.service.EscrutinioService;
import edu.cibertec.sicsolutions.vfs.service.ParametrosService;

public class EscrutinioAction extends DispatchAction{
	
	Integer flagEscrutinio = 0;
	
	public ActionForward init(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {		
	
		return mapping.findForward(Constants.SUCCESS_INIT);
	}
	
	
	public ActionForward realizarEscrutinio(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {		
	    HttpSession session = request.getSession();
	    Parametros parametro = new Parametros();
	  	parametro.setId(1);
	  	Timestamp fechaInicio =  Timestamp.valueOf(ParametrosService.getParametrosByPk(parametro).getValor() );	 
	  	parametro.setId(2);
	  	Timestamp fechaFinal =  Timestamp.valueOf(ParametrosService.getParametrosByPk(parametro).getValor() );
   	
	    if(DateUtil.getTimestampNow().before(fechaInicio)  ){
    	   request.getSession().setAttribute("msjEscrutinio", "La votacion todavia no ha iniciado");
    	   return mapping.findForward(Constants.SUCCESS_INIT);
        }
     
	    if(    DateUtil.getTimestampNow().after(fechaInicio) &&  DateUtil.getTimestampNow().before(fechaFinal)  ){
       	   request.getSession().setAttribute("msjEscrutinio", "La votacion esta en curso");
       	   return mapping.findForward(Constants.SUCCESS_INIT);
        }
	    
	    Usuario usuario = (Usuario)session.getAttribute("usuario");
		Consulado  consulado = ConsuladoService.getConsuladoByPk(new Consulado(usuario.getCodigoConsulado()));
		
		if(consulado.getFlagEstadoVotacion()==1){
			session.setAttribute("msjEscrutinio",  "No se ha realizado el cierre de la votacion");
			return mapping.findForward(Constants.SUCCESS_INIT);
		}
	    
	    if(flagEscrutinio ==0){
			 usuario = (Usuario)session.getAttribute(SessionConstants.USUARIO);		 
			Escrutinio[] escrutinios = EscrutinioService.findEscrutinioByConsulado(usuario.getCodigoConsulado());
			session.setAttribute(SessionConstants.LIST_ESCRUTINIO, escrutinios); 
			enviarEscrutinioAConsolidar(usuario.getCodigoConsulado());
			flagEscrutinio = 1;
	    }
	    else {
	    	session.setAttribute("msjEscrutinio",  "Ya se realizo el escrutinio.Solo se puede realizar una vez");
	    }
		return mapping.findForward(Constants.SUCCESS_INIT);
	}


	private void enviarEscrutinioAConsolidar(String codigoConsulado) throws Exception {
		Escrutinio[] enviarEscrutinios = EscrutinioService.resultEscrutinioByConsolidado(codigoConsulado);
		for (Escrutinio escrutinio : enviarEscrutinios) {
			Consolidado consolidado = new Consolidado();
			consolidado.setCodigoConsulado(codigoConsulado);
			consolidado.setCodigoCandidato(escrutinio.getCodigoCandidato().toString());
			consolidado.setCantidadVotosConsulado(escrutinio.getCantidadVotos());
			ConsolidadoService.insertConsolidado(consolidado); 
		} 
	}
}
